package Model;

import JDBC.Constants;
import JDBC.DBConnection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Estabelecimento {

    public Estabelecimento() {}

    public Estabelecimento(int id, String nome, String zona, int avaliacao){
        this.id = id;
        this.nome = nome;
        this.zona = zona;
        this.avaliacao = avaliacao;
    }

    private int id;
    private String nome;
    private String zona;
    private String tipo;
    private String cidade;
    private int avaliacao;
    private String morada;
    private String horario;
    private List<String> eventos;
    private List<String> pratos;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getZona() {
        return zona;
    }

    public void setZona(String zona) {
        this.zona = zona;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public int getAvaliacao() {
        return avaliacao;
    }

    public void setAvaliacao(int avaliacao) {
        this.avaliacao = avaliacao;
    }

    public List<String> getEventos() {
        return eventos;
    }

    public void setEventos(List<String> eventos) {
        this.eventos = eventos;
    }

    public List<String> getPratos() {
        return pratos;
    }

    public void setPratos(List<String> pratos) {
        this.pratos = pratos;
    }

    public int getId() {
        return id;
    }

    public String getMorada() {
        return morada;
    }

    public void setMorada(String morada) {
        this.morada = morada;
    }

    public String getHorario() {
        return horario;
    }

    public void setHorario(String horario) {
        this.horario = horario;
    }

    // Modificado -- a receber tipo pratos e eventos como lista e nao como String, faltava cidade e zona tambem
    public Estabelecimento[] select(String tipo, boolean comFotografia, int avaliacao, String nome, String cidade, String zona, List<String> pratos, List<String> eventos) {

        StringBuilder query = new StringBuilder().append("select distinct est.idEstabelecimento as Id, est.designacao as Nome, zona.designacao as Zona, est.rating as Avaliacao from Estabelecimento est inner join Zona zona where ");
        if(zona != null) {
            query.append(" zona.designacao = '" + zona + "' and ");
        }
        if(cidade != null) {
            query.append(" zona.cidade = '" + cidade + "' and ");
        }
        if(tipo != null) {
            query.append("est.tipoDoEstabelecimento = '" + tipo + "' and ");
        }
        if(comFotografia) {
            //Não foi especificada a selecção na interface
        }
        if(avaliacao != 0) {
            query.append("est.rating = " + avaliacao + " and ");
        }
        query.append("est.designacao like '%" + (nome != null ? nome : "") + "%'");


        /*
        if(pratos != null && !pratos.isEmpty()) {
            query += "inner join menuDoEstabelecimento inner join Prato pr ";

            StringBuilder pratos_query = new StringBuilder();
            pratos_query.append("and pr.descricao in ('");
            Iterator i = pratos.iterator();
            pratos_query.append(i.next());
            while (i.hasNext()) {
                pratos_query.append("' , '").append(i.next());
            }
            pratos_query.append("') ");
            pratos_query.toString();
        }

        if(eventos != null && !eventos.isEmpty()) {
            query += "inner join eventoOferecido inner join TipoDeEvento te ";

            StringBuilder eventos_query = new StringBuilder();
            eventos_query.append("and te.descricao in ('");
            Iterator i = eventos.iterator();
            eventos_query.append(i.next());
            while (i.hasNext()) {
                eventos_query.append("' , '").append(i.next());
            }
            eventos_query.append("') ");
            eventos_query.toString();
        }
        */

        DBConnection dbConnection = new DBConnection(Constants.DB_NAME, Constants.USER, Constants.PASSWORD, false, null);
        DBConnection.ConnectionHandler ch = DBConnection.getConnectionHandlerInstance();
        /*String query2 = "select distinct est.designacao as Nome, zona.designacao as Zona, est.rating  as Avaliação from Estabelecimento est " +
                "inner join Zona zona " +
                "inner join eventoOferecido inner join TipoDeEvento te " +
                "inner join menuDoEstabelecimento inner join Prato pr " +
                "where est.tipoDoEstabelecimento = 'rasco' and est.rating = 4 and est.designacao like '%Bom%' " +
                "and zona.designacao = 'Bairro de lata' and zona.cidade = 'London' " +
                "and te.descricao in ('Festa da cerveja', 'Baile de mascaras') " +
                "and pr.descricao in ('Arroz xau-xau', 'Arroz Branco Sem nada')";
                */
        dbConnection.returnResultSetSelectStatement(query.toString(), 1, ch);

        System.out.println("Query: " + query.toString());

        List<Estabelecimento> estabelecimentos = new ArrayList<Estabelecimento>();
        try {
            while (ch.r.next()) {
                Estabelecimento estabelecimento = new Estabelecimento(ch.r.getInt("Id"), ch.r.getString("Nome"), ch.r.getString("Zona"), ch.r.getInt("Avaliacao"));
                estabelecimentos.add(estabelecimento);
            }
            ch.r.close();
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        dbConnection.closeDatabase();

        // if(result == 0) throw exception
        return estabelecimentos.toArray(new Estabelecimento[0]);
    }

    public Estabelecimento[] selectAll() {
        DBConnection dbConnection = new DBConnection(Constants.DB_NAME, Constants.USER, Constants.PASSWORD, false, null);
        String query = "SELECT est.idEstabelecimento as Id, est.designacao as Nome, zona.designacao as Zona, est.rating as Avaliacao FROM estabelecimento est inner join Zona zona";

        DBConnection.ConnectionHandler ch = new DBConnection.ConnectionHandler();
        dbConnection.returnResultSetSelectStatement(query, 1, ch);

        List<Estabelecimento> estabelecimentos = new ArrayList<Estabelecimento>();
        try {
            while(ch.r.next()) {
                Estabelecimento estabelecimento = new Estabelecimento(ch.r.getInt("Id"), ch.r.getString("Nome"), ch.r.getString("Zona"), ch.r.getInt("Avaliacao"));
                estabelecimentos.add(estabelecimento);
            }
            ch.r.close();
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        dbConnection.closeDatabase();
        // if(result == 0) throw exception

        return estabelecimentos.toArray(new Estabelecimento[0]);
    }

    // Modificado -- acrescentado metodo, nao utilizado enumerado quando existe bd
    public String[] obterTiposEstabelecimento() {
        DBConnection dbConnection = new DBConnection(Constants.DB_NAME, Constants.USER, Constants.PASSWORD, false, null);
        String query = "SELECT * FROM tipoDeEstabelecimento";

        DBConnection.ConnectionHandler ch = new DBConnection.ConnectionHandler();
        dbConnection.returnResultSetSelectStatement(query, 1, ch);

        List<String> tiposEstabelecimentos = new ArrayList<String>();
        try {
            while(ch.r.next()) {
                String tipo = ch.r.getString("tipoDoEstabelecimento");
                tiposEstabelecimentos.add(tipo);
            }
            ch.r.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        dbConnection.closeDatabase();

        return tiposEstabelecimentos.toArray(new String[0]);
    }

    // Modificado --- metodo criado para popular detalhes estabelecimento no "Ecra detalhes de estabelecimento"
    public Estabelecimento getDetalhesEstabelecimento(int idEstabelecimento) {
        DBConnection dbConnection = new DBConnection(Constants.DB_NAME, Constants.USER, Constants.PASSWORD, false, null);
        String query = "SELECT est.designacao as nome, est.tipoDoEstabelecimento as tipo, est.morada, est.informacoesHorario as horario, est.rating as avaliacao, zona.cidade, zona.designacao as zona from Estabelecimento est inner join Zona zona on est.idZona = zona.idZona and est.idEstabelecimento = " + idEstabelecimento;

        DBConnection.ConnectionHandler ch = new DBConnection.ConnectionHandler();
        dbConnection.returnResultSetSelectStatement(query, 1, ch);

        Estabelecimento estabelecimento = null;
        try {
            if(ch.r.next()) {
                estabelecimento = new Estabelecimento(idEstabelecimento, ch.r.getString("nome"), ch.r.getString("zona"), ch.r.getInt("avaliacao"));
                estabelecimento.setTipo(ch.r.getString("tipo"));
                estabelecimento.setMorada(ch.r.getString("morada"));
                estabelecimento.setHorario(ch.r.getString("horario"));
                estabelecimento.setCidade(ch.r.getString("cidade"));
            }
            ch.r.close();
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        dbConnection.closeDatabase();

        return estabelecimento;
    }

}
